package com.w7vm.menuweb.managerBean;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import org.springframework.security.core.context.SecurityContextHolder;

import com.w7vm.menuweb.entity.AcessoWeb;
import com.w7vm.menuweb.entity.RestauranteFilialJuridicoWeb;
import com.w7vm.menuweb.entity.RestauranteFilialWeb;
import com.w7vm.menuweb.facade.AcessoFacade;
import com.w7vm.menuweb.message.MessageFaces;
import com.w7vm.menuweb.utility.Constantes;
import com.w7vm.menuweb.utility.PropertiesLoaderImpl;

@ManagedBean
@ViewScoped
public class PortalCardapioMB {
	

	@EJB
	private AcessoFacade acessoEJB;
	
	private List<AcessoWeb> usuarioAcessoL = null;
	
	private List<RestauranteFilialWeb> filialAcessoL = new ArrayList<RestauranteFilialWeb>();
	Constantes constObj = new Constantes();

	private LoginMB loginOjb = new LoginMB();

	private int idRestFilial;
	private boolean statusDialog = false;
	private AcessoWeb acessoObj;
	
	private int idRestSede;
	private String restSede;
	private String nomeUsuario;
	private String restauranteSelect;
	
	private String valorParametro = constObj.PAGINA_HOME_PORTAL;
	
	private RestauranteFilialWeb filialObj;
	private RestauranteFilialJuridicoWeb filialJuridicoObj;
	
	
	@PostConstruct
	public void init()
	{
		String valorKey = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("changeAccess");
		System.out.println("TROCAR ACESSO valorKey "+ valorKey);

		if(valorKey != null){
			valorParametro = valorKey;
			System.out.println("TROCAR ACESSO valorParametro "+ valorParametro );
		}
		loadAcessoUsuarioLogado();
	}
	
	
	public void gravaNomeRestauranteSessao(String nomeSessao, Object dado){
		loginOjb.gravarSessao(nomeSessao, dado);
	}
	
	public void loadInformacoesPortal(){
		System.out.println("loadInformacoesPortal()");
		defineDadosAcessoTela();
		redirecionaPaginaPortal();
	}
	
	public void cancelaOperacaoPortal() {
		
		if(!valorParametro.equals(constObj.PAGINA_ALTERA_ACESSO))
			redirecionaPaginaInicial();
		}

	public void redirecionaPaginaInicial(){
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect("../../public/index.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void redirecionaPaginaPortal(){
		try {
			FacesContext.getCurrentInstance().getExternalContext().redirect("../user/portalCardapioMundo.jsf");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void loadAcessoUsuarioLogado(){
		System.out.println("loadAcessoUsuarioLogado()");
		FacesContext context = FacesContext.getCurrentInstance();
		RequestContext contextResq = RequestContext.getCurrentInstance();
		int idUsuario = (Integer) loginOjb.getSessao("IDUsuario");
		setAcessoObj(new AcessoWeb());
		filialObj = new RestauranteFilialWeb();
		filialJuridicoObj = new RestauranteFilialJuridicoWeb();
		
		String nomeUsuario = (String) loginOjb.getSessao("NomeUsuario");
		String parametroSessao = (String) loginOjb.getSessao("NomeFantasia");
		System.out.println("ParametroSessao  "+ parametroSessao);
		
		nomeUsuario = "Olá "+ nomeUsuario;
		setNomeUsuario(nomeUsuario);
		
		if(usuarioAcessoL == null){
			usuarioAcessoL = acessoEJB.findUsuarioAcessoByIDUsuario(idUsuario);

			for(AcessoWeb objAcesso : usuarioAcessoL){
				
				if(objAcesso.getAcessoFilial().equals("N")){
					setIdRestSede(objAcesso.getRestauranteSedeWeb().getIdRestauranteSedeWeb());
					setRestSede(objAcesso.getRestauranteSedeWeb().getRestauranteSedeJuridicoWeb().getNomeFantasia());
				}
				else if(objAcesso.getAcessoFilial().equals("S")){
					System.out.println("getIdRestauranteFilialWeb()   "+ objAcesso.getRestauranteFilialWeb().getIdRestauranteFilialWeb());
					System.out.println("getNomeFantasiaFilial()   "+ objAcesso.getRestauranteFilialWeb().getRestauranteFilialJuridicoWeb().getNomeFantasiaFilial());
					filialObj.setIdRestauranteFilialWeb(objAcesso.getRestauranteFilialWeb().getIdRestauranteFilialWeb());
					
					filialJuridicoObj.setNomeFantasiaFilial(objAcesso.getRestauranteFilialWeb().getRestauranteFilialJuridicoWeb().getNomeFantasiaFilial());
					filialObj.setRestauranteFilialJuridicoWeb(filialJuridicoObj);
					filialAcessoL.add(filialObj);
					setFilialAcessoL(filialAcessoL);
					filialObj = new RestauranteFilialWeb();
					filialJuridicoObj = new RestauranteFilialJuridicoWeb();
				}

			}
			System.out.println("TAmanho List UsuarioAcessoL  "+ usuarioAcessoL.size());
			
			if(usuarioAcessoL.size() > 1)
			{
				if(parametroSessao == null || valorParametro.equals(constObj.PAGINA_ALTERA_ACESSO)){
					System.out.println("TAmanho List UsuarioAcessoL  "+ usuarioAcessoL.size());
					setStatusDialog(true);
					contextResq.execute("PF('acessoDialog').show();");
				}
			}
			else if(usuarioAcessoL.size() == 1){
				setStatusDialog(false);
				if(parametroSessao == null){
					defineDadosAcessoTela();
					redirecionaPaginaPortal();
				}
				else if(valorParametro.equals(constObj.PAGINA_ALTERA_ACESSO)){
					String msg = PropertiesLoaderImpl.getValor("ErroAlterarAcesso");
					FacesContext.getCurrentInstance().addMessage("mensagem" , new FacesMessage(FacesMessage.SEVERITY_INFO, "Usurio " + nomeUsuario + "",msg));  
					context.getExternalContext().getFlash().setKeepMessages(true);// adiciona esta linha.
					redirecionaPaginaPortal();
				}	
			}

		}
	}
	
	public void defineDadosAcessoTela(){
		System.out.println("defineDadosAcessoTela");
		
		// SELECIONADO OPCAO RESTAURANTE-SEDE
		if(getRestauranteSelect().equals(getRestSede())){
			gravaNomeRestauranteSessao("NomeFantasia",getRestSede());
			gravaNomeRestauranteSessao("AcessoFilial",constObj.ACESSO_FILIAL_NAO);
			gravaNomeRestauranteSessao("IDRestaurante",getIdRestSede());
			gravaNomeRestauranteSessao("IDSede",getIdRestSede());
		}
		else{
			// SELECIONADO OPCAO RESTAURANTE-FILIAL
			for(AcessoWeb objAcesso : usuarioAcessoL){
				int idFilial = Integer.parseInt(getRestauranteSelect()); 

				if(objAcesso.getAcessoFilial().equals("S")){
					
					if(objAcesso.getRestauranteFilialWeb().getIdRestauranteFilialWeb() == idFilial){
						String dado = objAcesso.getRestauranteFilialWeb().getRestauranteFilialJuridicoWeb().getNomeFantasiaFilial();
						int idSede = objAcesso.getRestauranteSedeWeb().getIdRestauranteSedeWeb();
						gravaNomeRestauranteSessao("NomeFantasia",dado);
						gravaNomeRestauranteSessao("AcessoFilial",constObj.ACESSO_FILIAL_SIM);
						gravaNomeRestauranteSessao("IDRestaurante",idFilial);
						gravaNomeRestauranteSessao("IDSede",idSede);
					}
				}
			}
		}
	}
	
	public int getIdRestFilial() {
		return idRestFilial;
	}


	public void setIdRestFilial(int idRestFilial) {
		System.out.println("setIdRestFilial "+  idRestFilial);
		this.idRestFilial = idRestFilial;
	}

	public List<RestauranteFilialWeb> getFilialAcessoL() {
		return filialAcessoL;
	}


	public void setFilialAcessoL(List<RestauranteFilialWeb> filialAcessoL) {
		this.filialAcessoL = filialAcessoL;
	}


	public boolean isStatusDialog() {
		return statusDialog;
	}


	public void setStatusDialog(boolean statusDialog) {
		this.statusDialog = statusDialog;
	}


	public int getIdRestSede() {
		return idRestSede;
	}


	public void setIdRestSede(int idRestSede) {
		this.idRestSede = idRestSede;
	}


	public String getRestSede() {
		return restSede;
	}


	public void setRestSede(String restSede) {
		this.restSede = restSede;
	}


	public String getNomeUsuario() {
		System.out.println("getNomeUsuario()   "+ nomeUsuario);
		return nomeUsuario;
	}


	public void setNomeUsuario(String nomeUsuario) {
		this.nomeUsuario = nomeUsuario;
	}

	public LoginMB getLoginOjb() {
		return loginOjb;
	}

	public void setLoginOjb(LoginMB loginOjb) {
		this.loginOjb = loginOjb;
	}

	public List<AcessoWeb> getUsuarioAcessoL() {
		return usuarioAcessoL;
	}

	public void setUsuarioAcessoL(List<AcessoWeb> usuarioAcessoL) {
		this.usuarioAcessoL = usuarioAcessoL;
	}

	public String getRestauranteSelect() {
		return restauranteSelect;
	}

	public void setRestauranteSelect(String restauranteSelect) {
		this.restauranteSelect = restauranteSelect;
	}

	public AcessoWeb getAcessoObj() {
		return acessoObj;
	}

	public void setAcessoObj(AcessoWeb acessoObj) {
		this.acessoObj = acessoObj;
	}

	public AcessoFacade getAcessoEJB() {
		return acessoEJB;
	}

	public void setAcessoEJB(AcessoFacade acessoEJB) {
		this.acessoEJB = acessoEJB;
	}

	public RestauranteFilialWeb getFilialObj() {
		return filialObj;
	}

	public void setFilialObj(RestauranteFilialWeb filialObj) {
		this.filialObj = filialObj;
	}

	public RestauranteFilialJuridicoWeb getFilialJuridicoObj() {
		return filialJuridicoObj;
	}

	public void setFilialJuridicoObj(RestauranteFilialJuridicoWeb filialJuridicoObj) {
		this.filialJuridicoObj = filialJuridicoObj;
	}



}
